home *** CD-ROM | disk | FTP | other *** search
-
- ; Listing5g.s AUF- UND ABSCROLLEN EINES BILDES DURCH ÄNDERN DER BITPLANEPTERS
- ; KOMBINIERT MIT DEM SPIEGELEFFEKT, HERGESTELLT MIT DEN MODULO
-
- SECTION CIPundCOP,CODE
-
- Anfang:
- move.l 4.w,a6 ; Execbase in a6
- jsr -$78(a6) ; Disable - stoppt das Multitasking
- lea GfxName(PC),a1 ; Adresse des Namen der zu öffnenden Lib in a1
- jsr -$198(a6) ; OpenLibrary
- move.l d0,GfxBase ; speichere diese Adresse in GfxBase
- move.l d0,a6
- move.l $26(a6),OldCop ; hier speichern wir die Adresse der Copperlist
- ; des Betriebssystemes
-
- ; POINTEN AUF UNSERE BITPLANES
-
- MOVE.L #PIC,d0 ; in d0 kommt die Adresse unserer PIC
- LEA BPLPOINTERS,A1 ; in a1 kommt die Adresse der Bitplane-
- ; Pointer der Copperlist
- MOVEQ #2,D1 ; Anzahl der Bitplanes -1 (hier sind es 3)
- ; für den DBRA - Zyklus
- POINTBP:
- move.w d0,6(a1) ; kopiert das niederwertige Word der Plane-
- ; Adresse ins richtige Word der Copperlist
- swap d0 ; vertauscht die 2 Word in d0 (1234 > 3412)
-
- move.w d0,2(a1) ; kopiert das hochwertige Word der Adresse des
- ; Plane in das richtige Word in der Copperlist
- swap d0 ; vertauscht erneut die 2 Word von d0
- ADD.L #40*256,d0 ; Zählen 10240 zu D0 dazu, -> nächstes Plane
-
- addq.w #8,a1 ; zu den nächsten Bplpointers in der Cop
- dbra d1,POINTBP ; Wiederhole D1 mal POINTBP (D1=n. bitplanes)
-
- move.l #COPPERLIST,$dff080 ; COP1LC - "Zeiger" auf unsere COP
- move.w d0,$dff088 ; COPJMP1 - Starten unsere COP
- move.w #0,$dff1fc ; FMODE - Deaktiviert das AGA
- move.w #$c00,$dff106 ; BPLCON3 - Deaktiviert das AGA
-
- mouse:
- cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
- bne.s mouse ; Wenn nicht, geh nicht weiter
-
- btst #2,$dff016 ; wenn die rechte Maustaste gedrückt ist,
- beq.s Warte ; überspringe die Routine
-
- bsr.s BewegeCopper ; Läßt Bild rauf und runter gehen durch
- ; Modifizieren der BitplanePointers
-
- Warte:
- cmpi.b #$ff,$dff006 ; Sind wir auf Zeile 255?
- beq.s Warte ; Wenn nicht, geh nicht weiter
-
- btst #6,$bfe001 ; linke Maustaste gedrückt?
- bne.s mouse ; wenn nicht, zurück zu mouse:
-
- move.l OldCop(PC),$dff080 ; COP1LC - "Zeiger" auf die Orginal-COP
- move.w d0,$dff088 ; COPJMP1 - und starten sie
-
- move.l 4.w,a6
- jsr -$7e(a6) ; Enable - stellt Multitasking wieder her
- move.l GfxBase(PC),a1 ; Basis der Library, die es zu schließen gilt
- ; (Libraries werden geöffnet UND geschlossen!)
- jsr -$19e(a6) ; Closelibrary - schließt die Graphics lib
- rts
-
- ; DATEN
-
- GfxName:
- dc.b "graphics.library",0,0
-
- GfxBase: ; Hier hinein kommt die Basisadresse der graphics.lib,
- dc.l 0 ; ab hier werden die Offsets gemacht
-
- OldCop: ; Hier hinein kommt die Adresse der Orginal-Copperlist des
- dc.l 0 ; Betriebssystemes
-
- ; Diese Routine bewegt das Bild nach oben und unten, imdem sie auf
- ; die Bitplanepointer in der Copperlist zugreift (Mit dem Label
- ; BPLPOINTERS).
- ;
-
- BewegeCopper:
- LEA BPLPOINTERS,A1 ; Mit diesen 4 Anweisungen holen wir aus der
- move.w 2(a1),d0 ; Copperlist die Adresse, wohin das $dff0e0
- swap d0 ; gerade pointet und geben diesen Wert
- move.w 6(a1),d0 ; in d0
-
- TST.B RaufRunter ; Müßen wir nach oben oder unten?
-
- beq.w GehRunter
- cmp.l #PIC-(40*18),d0 ; sind wir weit genug OBEN?
- beq.s SetzRunter ; wenn ja, sind wir am Ende und müßen runter
- sub.l #40,d0 ; subtrahieren 40, also 1 Zeile, dadurch
- ; wandert das Bild nach UNTEN
- bra.s Ende
-
-
- SetzRunter:
- clr.b RaufRunter ; Durch Löschen von RaufRunter wird das TST
- bra.s Ende
-
- GehRunter:
-
- cmpi.l #PIC+(40*130),d0; sind wir weit genug UNTEN?
- beq.s SetzRauf ; wenn ja, sind wir am unteren Ende und
- ; müßen wieder rauf
- add.l #40,d0 ; Addieren 40, also 1 Zeile, somit scrollt
- ; das Bild nach OBEN
- bra.s Ende
-
- SetzRauf:
- move.b #$ff,RaufRunter ; Wenn das Label nicht auf NULL steht,
- rts ; bedeutet das, daß wir rauf müßen
-
- Ende: ; POINTEN DIE BITPLANEPOINTER AN
- LEA BPLPOINTERS,A1 ; POINTER in der COPPERLIST
- MOVEQ #2,D1 ; Anzahl der Bitplanes -1 (hier: 3)
-
- POINTBP2:
- move.w d0,6(a1) ; kopiert das niederw. Word der Adress des Pl.
- swap d0 ; vertauscht die 2 Word von d0 (1234 > 3412)
- move.w d0,2(a1) ; kopiert das höherw. Word der Adresse des Pl.
- swap d0 ; vertauscht die 2 Word von d0 (3412 > 1234)
- ADD.L #40*256,d0 ; + Länge Bitplane -> nächstes Bitplane
- addq.w #8,a1 ; zu den nächsten bplpointers in der Cop
- dbra d1,POINTBP2 ; Wiederhole D1 Mal POINTBP (D1=n. bitplanes)
- rts
-
-
- ; Dieses Byte, vom Label RaufRunter markiert, ist ein FLAG.
-
- RaufRunter:
- dc.b 0,0
-
-
- SECTION GRAPHIC,DATA_C
-
-
- COPPERLIST:
- dc.w $120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 ; SPRITE
- dc.w $12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
- dc.w $134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
- dc.w $13e,$0000
-
- dc.w $8e,$2c81 ; DiwStrt (Register mit Standartwerten)
- dc.w $90,$2cc1 ; DiwStop
- dc.w $92,$0038 ; DdfStart
- dc.w $94,$00d0 ; DdfStop
- dc.w $102,0 ; BplCon1
- dc.w $104,0 ; BplCon2
- dc.w $108,0 ; Bpl1Mod
- dc.w $10a,0 ; Bpl2Mod
-
- ; 5432109876543210 ; BPLCON0:
- dc.w $100,%0011001000000000 ; Bits 13 und 12 an!! (3 = %011)
- ; 3 Bitplanes Lowres, nicht Lace
- BPLPOINTERS:
- dc.w $e0,$0000,$e2,$0000 ;erstes Bitplane - BPL0PT
- dc.w $e4,$0000,$e6,$0000 ;zweites Bitplane - BPL1PT
- dc.w $e8,$0000,$ea,$0000 ;drittes Bitplane - BPL2PT
-
- dc.w $0180,$000 ; Color0
- dc.w $0182,$475 ; Color1
- dc.w $0184,$fff ; Color2
- dc.w $0186,$ccc ; Color3
- dc.w $0188,$999 ; Color4
- dc.w $018a,$232 ; Color5
- dc.w $018c,$777 ; Color6
- dc.w $018e,$444 ; Color7
-
- ; SPIEGELEFFEKT (könnte man als "TextureMap-Effekt" verkaufen)
-
- dc.w $b007,$fffe
- dc.w $180,$004 ; Color0
- dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
- dc.w $10a,-40*7 ; Bpl2Mod
- dc.w $b307,$fffe
- dc.w $180,$006 ; Color0
- dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
- dc.w $10a,-40*6 ; Bpl2Mod
- dc.w $b607,$fffe
- dc.w $180,$008 ; Color0
- dc.w $108,-40*5 ; Bpl1Mod - Spiegel um 3 Mal halbiert
- dc.w $10a,-40*5 ; Bpl2Mod
- dc.w $bb07,$fffe
- dc.w $180,$00a ; Color0
- dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
- dc.w $10a,-40*4 ; Bpl2Mod
- dc.w $c307,$fffe
- dc.w $180,$00c ; Color0
- dc.w $108,-40*3 ; Bpl1Mod - Spiegel
- dc.w $10a,-40*3 ; Bpl2Mod
- dc.w $d007,$fffe
- dc.w $180,$00e ; Color0
- dc.w $108,-40*2 ; Bpl1Mod - normaler Spiegel
- dc.w $10a,-40*2 ; Bpl2Mod
- dc.w $d607,$fffe
- dc.w $180,$00f ; Color0
- dc.w $108,-40 ; Bpl1Mod - FLOOD, wiederholte Zeilen für den
- dc.w $10a,-40 ; Bpl2Mod - Vergrößerungseffekt in der Mitte
- dc.w $da07,$fffe
- dc.w $180,$00e ; Color0
- dc.w $108,-40*2 ; Bpl1Mod - normaler Spiegel
- dc.w $10a,-40*2 ; Bpl2Mod
- dc.w $e007,$fffe
- dc.w $180,$00c ; Color0
- dc.w $108,-40*3 ; Bpl1Mod - Spiegel
- dc.w $10a,-40*3 ; Bpl2Mod
- dc.w $ed07,$fffe
- dc.w $180,$00a ; Color0
- dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
- dc.w $10a,-40*4 ; Bpl2Mod
- dc.w $f507,$fffe
- dc.w $180,$008 ; Color0
- dc.w $108,-40*5 ; Bpl1Mod - Spiegel 3 Mal halbiert
- dc.w $10a,-40*5 ; Bpl2Mod
- dc.w $fa07,$fffe
- dc.w $180,$006 ; Color0
- dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
- dc.w $10a,-40*6 ; Bpl2Mod
- dc.w $fd07,$fffe
- dc.w $180,$004 ; Color0
- dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
- dc.w $10a,-40*7 ; Bpl2Mod
- dc.w $ff07,$fffe
- dc.w $180,$002 ; Color0
- dc.w $108,-40 ; stoppt das Bild, um nicht die Bytes vor dem
- dc.w $10a,-40 ; RAW anzuzeigen
-
- dc.w $FFFF,$FFFE ; Ende der Copperlist
-
- ; BILD
-
- dcb.b 40*98,0 ; oben freimachen
- PIC:
- incbin "amiga.320*256*3" ; hier laden wir das Bild im RAW-
- ; Format
- dcb.b 40*30,0 ; siehe oben
-
- end
-
- In diesem Beispiel wurde durch das Setzen mehrerer Modulo eine Art Spiegelung
- um eine ziemlich rudimentale, runde Fläche simuliert. Wenn man die Modulo
- richtig setzt, kann man auch Effekte wie "Vergrößerung" oder ZOOM erzielen,
- weiters auch zylindrische Verzerrungen, wie in diesem Beispiel, vor allem
- wenn man dann noch einige Farben zur Hilfe zieht, wie etwa der blaue
- Balken.
- Das Listing ist das gleiche wie in Listing5c.s, nur wurde hier die Copperlist
- etwas geändert. Durch die $dff102 (BPLCON1) konnte so etwas Realismus ins
- Spiel gebracht werden. Tauscht die Copperlist mit dieser aus, es ist eine
- Mischung mit der in Listing5d2.s
-
- -Ich erinnere, daß man die Tasten Amiga+x dazu verwenden kann, einen Teil
- auszuschneiden, der vorher mit Amiga+b markiert wurde. Dieser Teil kann
- dann mit Amiga+i in einem beliebeigen Ort eingesetzt werden, dort, wo gerade
- der Cursor steht.
-
- dc.w $b007,$fffe
- dc.w $180,$004 ; Color0
- dc.w $102,$011 ; bplcon1
- dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
- dc.w $10a,-40*7 ; Bpl2Mod
- dc.w $b307,$fffe
- dc.w $180,$006 ; Color0
- dc.w $102,$022 ; bplcon1
- dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
- dc.w $10a,-40*6 ; Bpl2Mod
- dc.w $b607,$fffe
- dc.w $180,$008 ; Color0
- dc.w $102,$033 ; bplcon1
- dc.w $108,-40*5 ; Bpl1Mod - Spiegel 3 Mal halbiert
- dc.w $10a,-40*5 ; Bpl2Mod
- dc.w $bb07,$fffe
- dc.w $180,$00a ; Color0
- dc.w $102,$044 ; bplcon1
- dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
- dc.w $10a,-40*4 ; Bpl2Mod
- dc.w $c307,$fffe
- dc.w $180,$00c ; Color0
- dc.w $102,$055 ; bplcon1
- dc.w $108,-40*3 ; Bpl1Mod - Spiegel
- dc.w $10a,-40*3 ; Bpl2Mod
- dc.w $d007,$fffe
- dc.w $180,$00e ; Color0
- dc.w $102,$066 ; bplcon1
- dc.w $108,-40*2 ; Bpl1Mod - normaler Spiegel
- dc.w $10a,-40*2 ; Bpl2Mod
- dc.w $d607,$fffe
- dc.w $180,$00f ; Color0
- dc.w $102,$077 ; bplcon1
- dc.w $108,-40 ; Bpl1Mod - FLOOD, wiederholte Zeilen für den
- dc.w $10a,-40 ; Bpl2Mod - Vergrößerungseffekt in der Mitte
- dc.w $da07,$fffe
- dc.w $180,$00e ; Color0
- dc.w $102,$066 ; bplcon1
- dc.w $108,-40*2 ; Bpl1Mod - normaler Spiegel
- dc.w $10a,-40*2 ; Bpl2Mod
- dc.w $e007,$fffe
- dc.w $180,$00c ; Color0
- dc.w $102,$055 ; bplcon1
- dc.w $108,-40*3 ; Bpl1Mod - Spiegel
- dc.w $10a,-40*3 ; Bpl2Mod
- dc.w $ed07,$fffe
- dc.w $180,$00a ; Color0
- dc.w $102,$044 ; bplcon1
- dc.w $108,-40*4 ; Bpl1Mod - Spiegel 2 Mal halbiert
- dc.w $10a,-40*4 ; Bpl2Mod
- dc.w $f507,$fffe
- dc.w $180,$008 ; Color0
- dc.w $102,$033 ; bplcon1
- dc.w $108,-40*5 ; Bpl1Mod - Spiegel 3 Mal halbiert
- dc.w $10a,-40*5 ; Bpl2Mod
- dc.w $fa07,$fffe
- dc.w $180,$006 ; Color0
- dc.w $102,$022 ; bplcon1
- dc.w $108,-40*6 ; Bpl1Mod - Spiegel 4 Mal halbiert
- dc.w $10a,-40*6 ; Bpl2Mod
- dc.w $fd07,$fffe
- dc.w $180,$004 ; Color0
- dc.w $102,$011 ; bplcon1
- dc.w $108,-40*7 ; Bpl1Mod - Spiegel 5 Mal halbiert
- dc.w $10a,-40*7 ; Bpl2Mod
- dc.w $ff07,$fffe
- dc.w $180,$002 ; Color0
- dc.w $102,$000 ; bplcon1
- dc.w $108,-40 ; stoppe das Bild, um nicht die Bytes vor
- dc.w $10a,-40 ; dem RAW anzuzeigen
-
-